package com.example.service;

import cn.hutool.core.date.DateUtil;
import com.example.entity.Comment;
import com.example.entity.User;
import com.example.mapper.CommentMapper;
import com.example.utils.TokenUtils;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class CommentService {

    @Resource
    private CommentMapper commentMapper;

    /**
     * 新增
     */
    public void add(Comment comment) {
        comment.setTime(DateUtil.now()); //设置评论发布的时间
        User currentUser = (User) TokenUtils.getCurrentUser();
        comment.setUserId(currentUser.getId()); //设置当前登录的用户id
        commentMapper.insert(comment); //将数据插入到数据库之后，便会得到主键id，如果当前节点为根节点时，便可将主键id作为root_id


        //设置root_id
        Integer pid = comment.getPid();
        if (pid != null) { //说明当前节点是其他节点的子节点（即当前评论是子评论）
            Comment parentComment = this.selectById(pid); //查询出当前评论的父评论
            comment.setRootId(parentComment.getRootId()); //设置当前评论的根节点（即根评论）
        } else { //说明当前节点是根节点
            comment.setRootId(comment.getId());
        }
        this.updateById(comment);
    }

    /**
     * 更新
     */
    public void updateById(Comment comment) {
        commentMapper.updateById(comment);
    }

    /**
     * 删除
     */
    public void deleteByid(Integer id) {
        this.deepDelete(id);
    }

    /**
     * 递归删除子评论
     */
    public void deepDelete(Integer pid) {
        List<Comment> children = commentMapper.selectByPid(pid); //查询出当前评论所有的子评论
        commentMapper.deleteById(pid); //删除当前评论
        for (Comment child : children) {
            deepDelete(child.getId()); //删除子评论的子评论
        }
    }

    /**
     * 批量删除
     */
    public void deleteBatch(List<Integer> ids) {
/*        for (Integer id : ids) {
            CommentMapper.deleteById(id);
        }*/
        commentMapper.deleteBatch(ids);
    }

    /**
     * 根据id查询
     */
    public Comment selectById(Integer id) {
        return commentMapper.selectById(id);
    }

    /**
     * 查询所有（条件查询）
     */
    public List<Comment> selectAll(Comment comment) {
        return commentMapper.selectAll(comment);
    }

    /**
     * 分页查询（在查询所有的基础上进行分页）
     */
    public PageInfo<Comment> selectPage(Comment comment,Integer pageNum, Integer pageSize) {
        PageHelper.startPage(pageNum,pageSize);
        List<Comment> list = commentMapper.selectRoot(comment); //查询根节点
        for (Comment root : list) {
            List<Comment> children = commentMapper.selectChildrenByRootId(root.getId()); //查询出当前根节点所有子节点
            root.setChildren(children);
        }
        return PageInfo.of(list);
    }

    /**
     * 分页查询（管理员后台查看评论）
     */
    public PageInfo<Comment> selectPageForAdmin(Comment comment,Integer pageNum, Integer pageSize) {
        PageHelper.startPage(pageNum,pageSize);
        List<Comment> list = commentMapper.selectAll(comment);
        return PageInfo.of(list);
    }

    /**
     * 查询评论的数量
     */
    public Integer selectCount(Integer fid, String module) {
        return commentMapper.selectCount(fid, module);
    }
}
